<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 什么叫闭包?
    // 闭包是指有权访问另一个函数作用域中变量的函数

    // 简单的来说: 函数在执行过程中返回了另一个函数,  (返回的函数中使用了父作用域的变量 => 父函数中的AO一直得不到释放 -> 可以长时间存储数据)

    // 如何形成闭包
    // 1. 函数在执行过程中返回了另一个函数或多个函数
    // 2. 返回的函数要使用父作用域中的变量
    // 3.  在函数的外部,有变量来引用返回的函数

    // 作用(优点):
    // 1. 长时间保存数据
    // 2. 减少全局变量的使用
    // 3. 可以函数外部访问函数内部的数据

    // 缺点:
    // 1. AO对象一直被引用,得不到释放 -> 占内存 , 如果应用过多,会导致内存泄露
    // 2. 函数外部访问函数内部的数据  => 不安全

    // debugger;
    function fn() {  // AO = {a:10,func:func}
        var a = 10;  // 11   12 

        function func() { // AO = {}
            a++;
            return a;  // 11
        }

        return func;
    }


    var res = fn();
    console.log(res);  // res = func     函数也是一个特殊的对象(res和func引用同一个内存地址)

    var result = res();    // 调用res  => 等价于调用 func
    console.log(result); // 11

    var result = res();    // 调用res  => 等价于调用 func
    console.log(result);

    var result = res();    // 调用res  => 等价于调用 func
    console.log(result);



</script>

</html>